﻿#ifndef _LOGGER_LOGGER_HPP_
#define _LOGGER_LOGGER_HPP_

#include <string>

// 为了确保跨平台兼容性，在Windows平台上处理glog相关头文件
#ifdef _WIN32
#include <direct.h>  // Windows平台用于创建目录
#else
#include <sys/stat.h> // Unix/Linux平台用于创建目录
#endif

// 定义GLOG_NO_ABBREVIATED_SEVERITIES以避免与其他库的ERROR宏冲突
#define GLOG_NO_ABBREVIATED_SEVERITIES

// 包含glog头文件
#include <glog/logging.h>
#include <glog/log_severity.h>

namespace fio66 {

// Logger class that wraps glog functionality
class Logger {
public:
    // Initialize the logger with default settings
    static void Initialize(const char* argv0) {
        // 初始化glog
        google::InitGoogleLogging(argv0);
        
        // 基本配置
        FLAGS_logtostderr = false;        // 不在标准错误输出
        FLAGS_alsologtostderr = true;     // 同时在标准错误输出
        FLAGS_colorlogtostderr = true;    // 彩色输出到标准错误
        FLAGS_minloglevel = 0;            // 最低日志级别：0 - INFO
        
        // 文件日志配置
        FLAGS_log_dir = "logs";           // 日志文件目录
        FLAGS_max_log_size = 100;         // 单个日志文件最大大小（MB）
        FLAGS_stop_logging_if_full_disk = true; // 磁盘满时停止日志
        
        // 创建日志目录（如果不存在）
        CreateLogDirectory(FLAGS_log_dir);
    }

    // Shutdown the logger
    static void Shutdown() {
        google::ShutdownGoogleLogging();
    }

    // Set log directory
    static void SetLogDirectory(const std::string& log_dir) {
        FLAGS_log_dir = log_dir;
        CreateLogDirectory(FLAGS_log_dir);
    }

    // Set log level
    static void SetLogLevel(int level) {
        if (level >= 0 && level <= 3) {
            FLAGS_minloglevel = level;
        }
    }
    
    // 启用/禁用文件日志
    static void EnableFileLogging(bool enable) {
        FLAGS_logtostderr = !enable; // 如果禁用文件日志，则只输出到stderr
    }
    
    // 启用/禁用控制台彩色输出
    static void EnableColorOutput(bool enable) {
        FLAGS_colorlogtostderr = enable;
    }
    
    // 设置最大日志文件大小（MB）
    static void SetMaxLogSize(int size_mb) {
        if (size_mb > 0) {
            FLAGS_max_log_size = size_mb;
        }
    }
    
    // 刷新日志到磁盘
    static void FlushLog() {
        google::FlushLogFiles(google::GLOG_INFO);
    }
    
private:
    // 创建日志目录（如果不存在）
    static void CreateLogDirectory(const std::string& log_dir) {
        #ifdef _WIN32
        _mkdir(log_dir.c_str());
        #else
        mkdir(log_dir.c_str(), 0755);
        #endif
    }
};

// Logging macros for convenience
// 基本日志宏 - 直接映射到glog的日志级别
#define LOGI LOG(INFO)
#define LOGW LOG(WARNING)
#define LOGE LOG(ERROR)
#define LOGF LOG(FATAL)

// 初始化帮助函数 - 使用glog的日志级别常量设置日志级别
static inline void SetLogLevelByEnum(int level) { Logger::SetLogLevel(level); }

}  // namespace fio66

#endif // _LOGGER_LOGGER_HPP_
